package com.neuedu.first;
import java.io.*;
public class ObjectStreamTestDriver {
    public static void main(String[] args) {
        test04();
    }

    /**
     * transient关键字的应用
     */
    private static void test04() {
        // 创建一个Student对象
        Student stu0 = new Student("张三", "150001", 90);
        // 将stu0变量的内容写出到指定的外部文件中进行持久化处理
        System.out.println("使用对象流持久化之前的Student内容：" + stu0);
        // 持久化保存的文件名
        String stu0_out01 = "E:\\demo\\temp\\iotest\\stu0_out02.dat";
        // 对象流写出
        writeObject(stu0, stu0_out01);
        // 使用对象流读取持久化的对象
        Object objReadin = readObject(stu0_out01);

        //验证持久化之前的遍历stu0和使用对象输入流读入的对象 objReadin 是不是同一个实例变量
        System.out.println("stu0 == objReadin:" + (stu0 == objReadin));

    }

    /**
     * 对象输入流:将对象输入流的内容读取到内存中
     */
    private static void test03() {
        // 创建一个Student对象
        Student stu0 = new Student("张三", "150001", 90);
        // 将stu0变量的内容写出到指定的外部文件中进行持久化处理
        System.out.println("使用对象流持久化之前的Student内容：" + stu0);
        // 持久化保存的文件名
        String stu0_out01 = "E:\\demo\\temp\\iotest\\stu0_out01.dat";
        // 对象流写出
        writeObject(stu0, stu0_out01);
        // 使用对象流读取持久化的对象
        Object objReadin = readObject(stu0_out01);

        //验证持久化之前的遍历stu0和使用对象输入流读入的对象 objReadin 是不是同一个实例变量
        System.out.println("stu0 == objReadin:" + (stu0 == objReadin));

    }


    /**
     * 对象输出流方法
     */
    private static void writeObject(Object object, String fileName) {
        // 创建一个对象输出流的实例对象
        try {
            ObjectOutputStream oos = new ObjectOutputStream(
                    new FileOutputStream(
                            new File(fileName)));
            // 使用对象输出流，将内存中的对象 stu0 的内容写出到指定的文件中进行持久化保存
            oos.writeObject(object);

            // 关闭资源
            if (oos != null) {
                oos.flush();
                oos.close();
            }
            System.out.println("对象保存成功！");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 对象输入流:将对象输入流的内容读取到内存中
     */
    private static Object readObject(String fileName) {
        // 默认返回值
        Object obj = null;
        try {
            // 创建一个对象输入流实例变量
            ObjectInputStream ois = new ObjectInputStream(
                    new FileInputStream(
                            new File(fileName)));
            // 读取对象输出流文件
            obj = ois.readObject();
            // 输出读入的对象内容
            System.out.println("对象输入流读取对象成功：" + obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }

    /**
     * 对象输入流:将对象输入流的内容读取到内存中
     */
    private static Object test02() {
        // 默认返回值
        Object obj = null;
        try {
            // 创建一个对象输入流实例变量
            ObjectInputStream ois = new ObjectInputStream(
                    new FileInputStream(
                            new File("E:\\demo\\temp\\iotest\\student01_out.dat")));
            // 读取对象输出流文件
            obj = ois.readObject();
            // 输出读入的对象内容
            System.out.println("对象输入流读取对象成功：" + obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }

    /**
     * 对象输出流
     */
    private static void test01() {
        // 创建一个Student类的实例对象
        Student stu0 = new Student("张三", "150001", 90);
        // 创建一个对象输出流的实例对象
        try {
            ObjectOutputStream oos = new ObjectOutputStream(
                    new FileOutputStream(
                            new File("E:\\demo\\temp\\iotest\\student01_out.dat")
                    )
            );
            // 使用对象输出流，将内存中的对象 stu0 的内容写出到指定的文件中进行持久化保存
            oos.writeObject(stu0);

            // 关闭资源
            if (oos != null) {
                oos.flush();
                oos.close();
            }
            System.out.println("对象保存成功！");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}